package string;
/**
 * 字符串String
 * 内部使用一个char数组保持所有在字符，每个字符为两个字节，存的是该字符的Unicode编码
 * 字符串是不变对象，一创建内容不可改变，若改变会创建新对象。
 */
public class StringDemo {
    public static void main(String [] args){
        String a="123abc";
        String a1="123abc";
        System.out.println(a==a1);//true,地址相同
        System.out.println(a.equals(a1));
        System.out.println(a==a1);
        String a2=new String("123adc");
        System.out.println(a.equals(a2));
        String a3=new String("123adc");
        System.out.println(a2.equals(a3));
        System.out.println(a2==a3);
        a=a+"!";//修改字符串内容会创建新对象!
        String s3="123abc";
        String s4="123"+"abc";
        System.out.println(s3==s4);
        /*
            这里触发了一个编译器的特性：
            编译器在编译期间若遇到几个计算表达式，发现在编译器可以确定结果时就会进行计算
            并将编译到.class文件中，这样以来JVM每次执行字节码文件就无需进行计算啦
            下面的代码会被编译为：
            String  s4="123abc";
            也因此s4会用常量池中的对象，所以地址与s3相同

         */
        String s5=1+"2"+3+"abc";
        System.out.println(s3==s5);
    }
}
